//
// io_service_pool.hpp
// ~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#ifndef HTTP_SERVER2_IO_SERVICE_POOL_HPP
#define HTTP_SERVER2_IO_SERVICE_POOL_HPP

#include <boost/asio.hpp>
#include <vector>
#include <iostream>
#include <utility>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
#include "lua_interface.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <unistd.h>
#include <limits.h>

namespace http {
    namespace server3 {

        /// A pool of io_service objects.
        class io_service_pool
            : private boost::noncopyable
        {
        public:
            typedef std::pair< boost::reference_wrapper<boost::asio::io_service>,
                    boost::reference_wrapper<request_handler> > io_handler_pair;
            /// Construct the io_service pool.
            explicit io_service_pool(std::size_t pool_size);

            /// Run all io_service objects in the pool.
            void run();

            /// Stop all io_service objects in the pool.
            void stop();
            void reloadLuaScripts();
            io_handler_pair get_io_handler();

        private:
            typedef boost::shared_ptr<boost::asio::io_service> io_service_ptr;
            typedef boost::shared_ptr<request_handler> request_handler_ptr;
            typedef boost::shared_ptr<boost::asio::io_service::work> work_ptr;

            /// The pool of io_services.
            std::vector<io_service_ptr> io_services_;
            std::vector<request_handler_ptr> request_handlers_;

            /// The work that keeps the io_services running.
            std::vector<work_ptr> work_;

            /// The next io_service to use for a connection.
            std::size_t next_io_service_;
        };

    } // namespace server2
} // namespace http

#endif // HTTP_SERVER2_IO_SERVICE_POOL_HPP
